// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/logging.h"
#include "base/win/windows_version.h"
#include "ui/base/touch/touch_device.h"
#include <windows.h>

namespace ui {

namespace {

    bool IsTouchDevicePresent()
    {
        int value = GetSystemMetrics(SM_DIGITIZER);
        return (value & NID_READY) && ((value & NID_INTEGRATED_TOUCH) || (value & NID_EXTERNAL_TOUCH));
    }

} // namespace

TouchScreensAvailability GetTouchScreensAvailability()
{
    if (!IsTouchDevicePresent())
        return TouchScreensAvailability::NONE;

    return TouchScreensAvailability::ENABLED;
}

int MaxTouchPoints()
{
    if (!IsTouchDevicePresent())
        return 0;

    return GetSystemMetrics(SM_MAXIMUMTOUCHES);
}

int GetAvailablePointerTypes()
{
    int available_pointer_types = 0;
    if (IsTouchDevicePresent())
        available_pointer_types |= POINTER_TYPE_COARSE;
    if (GetSystemMetrics(SM_MOUSEPRESENT) != 0 && GetSystemMetrics(SM_CMOUSEBUTTONS) > 0)
        available_pointer_types |= POINTER_TYPE_FINE;

    if (available_pointer_types == 0)
        available_pointer_types = POINTER_TYPE_NONE;

    return available_pointer_types;
}

PointerType GetPrimaryPointerType()
{
    int available_pointer_types = GetAvailablePointerTypes();
    if (available_pointer_types & POINTER_TYPE_FINE)
        return POINTER_TYPE_FINE;
    if (available_pointer_types & POINTER_TYPE_COARSE)
        return POINTER_TYPE_COARSE;
    DCHECK_EQ(available_pointer_types, POINTER_TYPE_NONE);
    return POINTER_TYPE_NONE;
}

int GetAvailableHoverTypes()
{
    int available_hover_types = 0;
    if (IsTouchDevicePresent())
        available_hover_types |= HOVER_TYPE_ON_DEMAND;
    if (GetSystemMetrics(SM_MOUSEPRESENT) != 0)
        available_hover_types |= HOVER_TYPE_HOVER;

    if (available_hover_types == 0)
        available_hover_types = HOVER_TYPE_NONE;

    return available_hover_types;
}

HoverType GetPrimaryHoverType()
{
    int available_hover_types = GetAvailableHoverTypes();
    if (available_hover_types & HOVER_TYPE_HOVER)
        return HOVER_TYPE_HOVER;
    if (available_hover_types & HOVER_TYPE_ON_DEMAND)
        return HOVER_TYPE_ON_DEMAND;
    DCHECK_EQ(available_hover_types, HOVER_TYPE_NONE);
    return HOVER_TYPE_NONE;
}

} // namespace ui
